package com.cskaoyan.jdbc.datasource;

import com.cskaoyan.jdbc.utils.JDBCUtils;
import com.mysql.jdbc.StringUtils;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.util.LinkedList;
import java.util.Properties;

/**
 * 创建日期: 2022/05/13 17:20
 *
 * @author ciggar
 *
 * 手动实现数据库连接池
 * 第二个版本
 * 优化：
 *  增加连接池自动扩容的功能
 *
 *  第三个版本：
 *      可配置化
 * TODO:还有没有可以优化的地方呢？
 * 还有很多。
 * 1. 可以实现超时自动回收的功能
 * 2. 可以实现获取连接等待的功能
 * 3. 实现javax.sql.Datasource接口
 * 4. 对事务加入支持
 * ......
 *
 */
public class MyConnectionPool3{


    // 初识容量
    static int INIT_SIZE = 10;

    // 最小容量
    static int MIN_SIZE = 2;

    // 扩容数量
    static int ADD_INCREMENT = 5;

    // 最大容量
    static int MAX_SIZE = 30;

    // 连接的总数量
    static int count = 0;



    // 用来保存连接的容器
    // 假如连接从头部存，从尾部取
    static LinkedList<Connection> pool;

    static {

        pool = new LinkedList<>();

        Properties properties = new Properties();
        try {
            properties.load(new FileInputStream("datasource.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 获取数据
        String init_size = properties.getProperty("init_size");
        String min_size = properties.getProperty("min_size");
        String max_size = properties.getProperty("max_size");
        String add_increment = properties.getProperty("add_increment");


        // 赋值
        if (init_size != null && init_size.length() > 0) {
            INIT_SIZE = Integer.valueOf(init_size);
        }

        if (min_size != null && min_size.length() > 0) {
            MIN_SIZE = Integer.valueOf(min_size);
        }

        if (max_size != null && max_size.length() > 0) {
            MAX_SIZE = Integer.valueOf(max_size);
        }

        if (add_increment != null && add_increment.length() > 0) {
            ADD_INCREMENT = Integer.valueOf(add_increment);
        }

        addCapacity(INIT_SIZE);

    }

    // 获取连接
    public static Connection getConnection(){



        if (pool.size() < MIN_SIZE) {

            // 自动扩容
            addCapacity(ADD_INCREMENT);

        }

        Connection connection = pool.removeLast();
        return connection;

    }



    // 返回连接
    public static void returnConnection(Connection connection){

        pool.addFirst(connection);

    }


    // 增加连接的方法
    private static void addCapacity(Integer size){

        if (size <= 0) return;

        // 如果扩容超过最大值，直接返回
        if (count > MAX_SIZE) {
            return;
        }

        // 扩容
        for (int i = 0; i < size; i++) {
            Connection connection = JDBCUtils.getConnection();
            pool.addFirst(connection);
            count ++;
        }
    }
}
